package cn.yzstu.utils;

import com.alibaba.fastjson.JSONObject;
import de.odysseus.staxon.json.JsonXMLConfig;
import de.odysseus.staxon.json.JsonXMLConfigBuilder;
import de.odysseus.staxon.json.JsonXMLInputFactory;
import de.odysseus.staxon.xml.util.PrettyXMLEventWriter;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLOutputFactory;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Set;

/**
 * \* User: Baldwin
 * \* E_Mail: baldwin@chancellorhk.com || DikeyWang@163.com
 * \* Date: 2020/4/13
 * \* Time: 14:18
 * \* Description:JsonUtil
 * \
 * @author Baldwin
 */
public class JsonUtil {

    /**
     *@描述 将Json字符串转化为XML格式文本
     *@方法名 json2xml
     *@参数  [json]
     *@返回值  java.lang.String
     *@创建人  Baldwin
     *@创建时间  2020/4/13
     *@修改人和其它信息
     */
    public static String json2xml(String json) {
        StringReader input = new StringReader(json);
        StringWriter output = new StringWriter();
        JsonXMLConfig config = new JsonXMLConfigBuilder().multiplePI(false).repairingNamespaces(false).build();
        try {
            XMLEventReader reader = new JsonXMLInputFactory(config).createXMLEventReader(input);
            XMLEventWriter writer = XMLOutputFactory.newInstance().createXMLEventWriter(output);
            writer = new PrettyXMLEventWriter(writer);
            writer.add(reader);
            reader.close();
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                output.close();
                input.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // remove <?xml version="1.0" encoding="UTF-8"?>
        if (output.toString().length() >= 38) {
            return output.toString().substring(39);
        }
        return output.toString();
    }

    /**
     * @描述
     * @方法名 getSimpleJson
     * @参数 [sourceJson]
     * @返回值 com.alibaba.fastjson.JSONObject
     * @创建人 Baldwin
     * @创建时间 2020/4/14
     * @修改人和其它信息
     */
    public static JSONObject getSimpleJson(String sourceKey, JSONObject sourceJson) {
        JSONObject simpleJson = new JSONObject();
        Set<String> keySet = sourceJson.keySet();
        Object object;
        for (String key : keySet) {
            StringBuilder simpleKey = new StringBuilder();
            simpleKey.append(sourceKey).append(key);
            object = sourceJson.get(key);
            if (object instanceof JSONObject) {
                JSONObject jsonObject = (JSONObject) object;
                JSONObject ssJson = getSimpleJson(simpleKey.toString(), jsonObject);
                Set<String> ssKetSet = ssJson.keySet();
                for (String ssKey : ssKetSet) {
                    simpleJson.put(ssKey, ssJson.get(ssKey));
                }
            } else {
                simpleJson.put(simpleKey.toString(), object);
            }

        }
        return simpleJson;
    }

    /**
     * @描述 获取嵌套的Json转化为最简单Json，仅支持Json的嵌套
     * @方法名 getSimpleJson
     * @参数 [sourceJson]
     * @返回值 com.alibaba.fastjson.JSONObject
     * @创建人 Baldwin
     * @创建时间 2020/4/16
     * @修改人和其它信息
     */
    public static JSONObject getSimpleJson(JSONObject sourceJson) {
        return getSimpleJson("", sourceJson);
    }
}